﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Collections.Generic;

/******************************************************************************************
 ** 文件名：	ColumnComponent
 ** 创建人：	Tony Mucor
 ** 日期：	2013-07-18
 ** 描述：	栏目控制层类
 *****************************************************************************************/

/// <summary>
/// ColumnComponent 栏目控制层
/// </summary>
public class ColumnComponent
{
	public ColumnDB clsData;

	#region 构造函数
	public ColumnComponent()
	{
		clsData = new ColumnDB();
	}
	#endregion

	#region 方法

	/**********************************************************************************************
	 ** 函数名：	DatabaseToEntity
	 ** 功能描述：	把DataRow中数据映射到栏目实体对象中
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-18
	 ** 备注：
	 *********************************************************************************************/
	private Column DatabaseToEntity(DataRow dr)
	{
		Column clsColumn = new Column();

		if (dr != null)
		{
			clsColumn.ID = Convert.ToInt32(dr["Columns_ID"]);
			clsColumn.Name = dr["Columns_Name"].ToString();
			clsColumn.FatherID = Convert.ToInt32(dr["Columns_FatherID"]);
			if (Convert.ToInt32(dr["Columns_FatherID"]) != 0)
			{
				clsColumn.FatherName = clsData.GetNameByID(Convert.ToInt32(dr["Columns_FatherID"]));
			}
			clsColumn.Link = dr["Columns_Link"].ToString();
			clsColumn.Grade = Convert.ToInt32(dr["Columns_Grade"]);
			clsColumn.Status = Convert.ToInt32(dr["Columns_Status"]);
			clsColumn.Order = Convert.ToInt32(dr["Columns_Order"]);
			clsColumn.Type = Convert.ToInt32(dr["Columns_Type"]);
			clsColumn.TypeName = clsData.clsConfig.strArrColumnType[clsColumn.Type];
		}
		return clsColumn;
	}

	/**********************************************************************************************
	 ** 功能描述：	根据实体对象设置到数据层
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-28
	 ** 备注：
	 *********************************************************************************************/
	/// <summary>
	/// 把实体对象对应到数据库
	/// </summary>
	private void EntityToDatabase(Column clsColumn)
	{
		clsData.arrTableColumnValue[0] = clsColumn.ID.ToString();
		clsData.arrTableColumnValue[1] = clsColumn.Name;
		clsData.arrTableColumnValue[2] = clsColumn.FatherID.ToString();
		clsData.arrTableColumnValue[3] = clsColumn.Link;
		clsData.arrTableColumnValue[4] = clsColumn.Grade.ToString();
		clsData.arrTableColumnValue[5] = clsColumn.Status.ToString();
		clsData.arrTableColumnValue[6] = clsColumn.Order.ToString();
		clsData.arrTableColumnValue[7] = clsColumn.Type.ToString();
	}

	/**********************************************************************************************
	 ** 函数名：	QueryByFatherID
	 ** 功能描述：	根据上级栏目ID查询栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：	符合条件的栏目实体
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-18
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryByFatherID(int nFatherID)
	{
		List<Column> list = new List<Column>();
		DataTable dt;

		dt = clsData.QueryByFatherID(nFatherID);

		foreach(DataRow dr in dt.Rows)
		{
			list.Add(DatabaseToEntity(dr));
		}

		return list;
	}

	/**********************************************************************************************
	 ** 函数名：	QueryOneByID
	 ** 功能描述：	根据栏目ID查询栏目
	 ** 输入参数：
	 ** 输出参数：	list
	 ** 返回值：	包含一个栏目的List
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-18
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryOneByID(int nID)
	{
		DataRow dr;
		List<Column> list = new List<Column>();
		Column clsColumn = new Column();

		dr = clsData.QueryOneToDataRow(nID);

		if (dr != null)
		{
			clsColumn = this.DatabaseToEntity(dr);
			list.Add(clsColumn);
		}
		
		return list;
	}

	/**********************************************************************************************
	 ** 函数名：	QueryFatherIDByID
	 ** 功能描述：	根据栏目ID查询栏目上级栏目的ID
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-18
	 ** 备注：
	 *********************************************************************************************/
	public int QueryFatherIDByID(int nID)
	{
		DataRow dr;
		Column clsColumn = new Column();

		dr = clsData.QueryOneToDataRow(nID);

		clsColumn = this.DatabaseToEntity(dr);

		return clsColumn.FatherID;
	}

	/**********************************************************************************************
	 ** 函数名：	QueryColumnsByGrade
	 ** 功能描述：	根据栏目实体，查找比它高一级的所有栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-19
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryColumnsByGrade(Column clsColumn)
	{
		int nGrade;
		DataTable dt;
		List<Column> list = new List<Column>();

		nGrade = clsColumn.Grade - 1;

		dt = clsData.QueryByGrade(nGrade);
		foreach (DataRow dr in dt.Rows)
		{
			list.Add(this.DatabaseToEntity(dr));
		}

		return list;
	}

	/**********************************************************************************************
	 ** 函数名：	QuerySameColumnsByGrade
	 ** 功能描述：	根据栏目实体，查找和它同级的所有栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-19
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QuerySameColumnsByGrade(Column clsColumn)
	{
		int nGrade;
		DataTable dt;
		List<Column> list = new List<Column>();

		nGrade = clsColumn.Grade;

		dt = clsData.QueryByGrade(nGrade);
		foreach (DataRow dr in dt.Rows)
		{
			list.Add(this.DatabaseToEntity(dr));
		}

		return list;
	}

	/**********************************************************************************************
	 ** 函数名：	GetOneByID
	 ** 功能描述：	根据ID返回一个实体
	 ** 输入参数：
	 ** 输出参数：	clsColumn
	 ** 返回值：	一个实体对象
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-19
	 ** 备注：
	 *********************************************************************************************/
	public Column GetOneByID(int nID)
	{
		DataRow dr;
		Column clsColumn = new Column();

		dr = clsData.QueryOneToDataRow(nID);

		if (dr != null)
		{
			clsColumn = this.DatabaseToEntity(dr);
		}
		else
		{
			clsColumn = null;
		}

		return clsColumn;
	}

	/**********************************************************************************************
	 ** 函数名：	QueryAllFirstColumns
	 ** 功能描述：	查询所有一级栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-22
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryAllFirstColumns()
	{
		Column clsColumn = new Column();
		List<Column> list = new List<Column>();
		DataTable dt;

		dt = clsData.QueryByGrade(clsData.clsConfig.nFirst);

		foreach(DataRow dr in dt.Rows)
		{
			clsColumn = this.DatabaseToEntity(dr);
			list.Add(clsColumn);
		}

		return list;
	}

	

	/**********************************************************************************************
	 ** 功能描述：	根据栏目ID组成的字符串查询栏目（字符串样子：1, 2, 3）
	 ** 输入参数：
	 ** 输出参数：	list
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-24
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryByColumnsID(string strColumnsID)
	{
		DataTable dt;
		List<Column> list;

		list = new List<Column>();
		dt = clsData.QueryByColumnsID(strColumnsID);
		foreach (DataRow dr in dt.Rows)
		{
			list.Add(this.DatabaseToEntity(dr));
		}

		return list;
	}

	/**********************************************************************************************
	 ** 功能描述：	根据用户组栏目访问权限查询一级栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-26
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryFirstColumnByColumnIDs(string strColumnIDs)
	{
		List<Column> list;
		DataTable dt;

		list = new List<Column>();
		dt = clsData.QueryByGradeIDs(clsData.clsConfig.nFirst, strColumnIDs);
		foreach (DataRow dr in dt.Rows)
		{
			list.Add(this.DatabaseToEntity(dr));
		}

		return list;
	}

	/**********************************************************************************************
	 ** 功能描述：	根据用户组栏目访问权限查询后台一级栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-09
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryFirstAdminColumnByColumnIDs(string strColumnIDs)
	{
		List<Column> list;
		DataTable dt;

		list = new List<Column>();
		dt = clsData.QueryByGradeIDsType(clsData.clsConfig.nFirst, strColumnIDs, clsData.clsConfig.nAdminColumn);
		foreach (DataRow dr in dt.Rows)
		{
			list.Add(this.DatabaseToEntity(dr));
		}

		return list;
	}

	/**********************************************************************************************
	 ** 功能描述：	根据栏目上级栏目ID，和用户组权限查询栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-26
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryByFatherIDColumnIDs(int nFatherID, string strColumnIDs)
	{
		List<Column> list;
		DataTable dt;

		list = new List<Column>();
		dt = clsData.QueryByFatherIDColumnIDs(nFatherID, strColumnIDs);
		foreach (DataRow dr in dt.Rows)
		{
			list.Add(this.DatabaseToEntity(dr));
		}

		return list;
	}

	/**********************************************************************************************
	 ** 功能描述：	根据栏目的地址，查找该栏目所属一级栏目的ID
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-26
	 ** 备注：
	 *********************************************************************************************/
	public int GetFirstColumnIDByLink(string strColumnLink)
	{
		DataTable dt;
		Column clsColumn;

		dt = clsData.QueryByLink(strColumnLink);
		if (dt.Rows.Count > 0)
		{
			clsColumn = this.DatabaseToEntity(dt.Rows[0]);
			while (clsColumn.FatherID != 0)
			{
				clsColumn = GetOneByID(clsColumn.FatherID);
			}
			return clsColumn.ID;
		}
		else
		{
			return 0;
		}
	}

	#endregion

	/**********************************************************************************************
	 ** 功能描述：	根据栏目ID获得栏目名称
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-01
	 ** 备注：
	 *********************************************************************************************/
	public string GetNameByID(int nID)
	{
		return GetOneByID(nID).Name;
	}

	/**********************************************************************************************
	 ** 功能描述：	查询所有栏目根据等级排序，显示一级栏目，如果一级栏目下有二级栏目，该一级栏目下面紧接的就是二级栏目，同理三级
	 ** 输入参数：	string strDelimiter	下级栏目前加入符号
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-06
	 ** 备注：	
	 *********************************************************************************************/
	public List<Column> QueryAllOrderGrade(string strDelimiter)
	{
		List<Column> listAll;		// 排好序的所有栏目
		List<Column> listFirst;		// 所有一级栏目

		listAll = new List<Column>();
		listFirst = new List<Column>();

		listFirst = this.QueryAllFirstColumns();

		for (int i = 0; i < listFirst.Count; i++)
		{
			listAll.Add(listFirst[i]);		// 把一级栏目添加到需要返回的List中
			this.QueryByFatherID(listFirst[i].ID, listAll, strDelimiter);
		}

		return listAll;
	}

	/// <summary>
	/// <para>功能描述：	查询下级栏目</para>
	/// <para>输入参数：	</para>
	/// <para>返回值：	</para>
	/// <para>方法范围：	protected</para>
	/// <para>作者：	Tony Mucor</para>
	/// <para>日期：	2013-08-06</para>
	/// <para>备注：	</para>
	/// </summary>
	public void QueryByFatherID(int nFatherID, List<Column> list, string strDelimiter)
	{
		List<Column> listChild;
		string strEmpty;
		string strTemp;

		strTemp = "|";
		
		strEmpty = "";
		listChild = new List<Column>();

		listChild = this.QueryByFatherID(nFatherID);

		for (int i = 0; i < listChild.Count; i++)
		{
			strEmpty = "";
			for (int j = 1; j < listChild[i].Grade; j++)
			{
				strEmpty = strEmpty + strDelimiter;
			}
			listChild[i].Name = strTemp + strEmpty + listChild[i].Name;
			list.Add(listChild[i]);
			QueryByFatherID(listChild[i].ID, list, strDelimiter);
		}
	}

	/// <summary>
	/// <para>功能描述：根据权限查询栏目，栏目根据等级排序，显示一级栏目，如果一级栏目下有二级栏目，该一级栏目下面紧接的就是二级栏目，同理三级</para>
	/// <para>输入参数：strColumnIDs	权限</para>
	/// <para>输入参数：strDelimiter	栏目名称前符号</para>
	/// <para>输出参数：</para>
	/// <para>返回值：</para>
	/// <para>作者：Tony Mucor</para>
	/// <para>日期：2013-08-02</para>
	/// <para>备注：</para>
	/// </summary>
	public List<Column> QueryByColumnIDsOrderGrade(string strColumnIDs, string strDelimiter)
	{
		List<Column> listAll;		// 排好序的所有栏目
		List<Column> listFirst;		// 所有一级栏目
		List<Column> listChild;		// 下级栏目

		listAll = new List<Column>();
		listFirst = new List<Column>();
		listChild = new List<Column>();

		listFirst = this.QueryFirstColumnByColumnIDs(strColumnIDs);

		for (int i = 0; i < listFirst.Count; i++)
		{
			listAll.Add(listFirst[i]);		// 把一级栏目添加到需要返回的List中

			this.QueryByFatherIDColumnIDs(listFirst[i].ID, strColumnIDs, listAll, strDelimiter);
		}

		return listAll;
	}

	/// <summary>
	/// <para>功能描述：根据上级栏目ID，和权限查询栏目，并把栏目添加到参数list中</para>
	/// <para>输入参数：nFatherID		上级栏目ID</para>
	/// <para>输入参数：strColumnIDs	权限</para>
	/// <para>输入参数：list		存储查询结果的list</para>
	/// <para>输入参数：strDelimiter	栏目名称前分隔符</para>
	/// <para>输出参数：</para>
	/// <para>返回值：</para>
	/// <para>作者：Tony Mucor</para>
	/// <para>日期：2013-08-02</para>
	/// <para>备注：</para>
	/// </summary>
	private void QueryByFatherIDColumnIDs(int nFatherID, string strColumnIDs, List<Column> list, string strDelimiter)
	{
		List<Column> listChild;
		string strEmpty;
		string strTemp;

		strEmpty = "";
		listChild = new List<Column>();
		strTemp = "  ";

		listChild = this.QueryByFatherIDColumnIDs(nFatherID, strColumnIDs);

		for (int i = 0; i < listChild.Count; i++)
		{
			//if (listChild[i].Grade == 2 )
			//{
			//        strEmpty = "|";
			//}
			//else
			//{
			//        strEmpty = "";
			//}
			strEmpty = "";
			for (int j = 1; j < listChild[i].Grade; j++)
			{
				strEmpty = strEmpty + strDelimiter;
			}
			listChild[i].Name = strTemp + strEmpty + listChild[i].Name;
			list.Add(listChild[i]);
			QueryByFatherIDColumnIDs(listChild[i].ID, strColumnIDs, list, strDelimiter);
		}
	}

	/// <summary>
	/// <para>功能描述：	查询一个用户有权限访问的前台栏目，并根据栏目等级排序显示</para>
	/// <para>		例如：先排序一级栏目，如果此一级栏目下有二级栏目，则马上排序二级栏目</para>
	/// <para>输入参数：	string strRights		用户有权限访问的栏目</para>
	/// <para>返回值：	</para>
	/// <para>方法范围：	public</para>
	/// <para>作者：	Tony Mucor</para>
	/// <para>日期：	2013-08-09</para>
	/// <para>备注：	</para>
	/// </summary>
	public List<Column> QueryHaveRightColumns(string strRights)
	{
		List<Column> listAll;		// 排好序的所有栏目
		List<Column> listFirst;		// 所有一级栏目
		List<Column> listChild;		// 下级栏目
		string strDelimiter;		// 上、下级栏目分隔符

		strDelimiter = "--";
		listAll = new List<Column>();
		listFirst = new List<Column>();
		listChild = new List<Column>();

		listFirst = this.QueryFirstWebColumnByColumnIDs(strRights);

		for (int i = 0; i < listFirst.Count; i++)
		{
			listAll.Add(listFirst[i]);		// 把一级栏目添加到需要返回的List中

			this.QueryByFatherIDColumnIDs(listFirst[i].ID, strRights, listAll, strDelimiter);
		}

		return listAll;
	}

	/**********************************************************************************************
	 ** 功能描述：	根据用户组栏目访问权限查询前台一级栏目
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-09
	 ** 备注：
	 *********************************************************************************************/
	public List<Column> QueryFirstWebColumnByColumnIDs(string strColumnIDs)
	{
		List<Column> list;
		DataTable dt;

		list = new List<Column>();
		dt = clsData.QueryByGradeIDsType(clsData.clsConfig.nFirst, strColumnIDs, clsData.clsConfig.nWebColumn);
		foreach (DataRow dr in dt.Rows)
		{
			list.Add(this.DatabaseToEntity(dr));
		}

		return list;
	}


	#region 添加、修改、删除
	/**********************************************************************************************
	 ** 功能描述：	添加一个栏目实体
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-22
	 ** 备注：
	 *********************************************************************************************/
	public Boolean Add(Column clsColumn)
	{
		Column clsFatherColumn;
		clsFatherColumn = this.GetOneByID(clsColumn.FatherID);
		if (clsFatherColumn != null)
		{
			clsColumn.Grade = clsFatherColumn.Grade + 1;
		}
		else
		{
			clsColumn.Grade = clsData.clsConfig.nFirst;
		}

		EntityToDatabase(clsColumn);
		return clsData.Add();
	}

	/**********************************************************************************************
	 ** 功能描述：	修改
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-22
	 ** 备注：
	 *********************************************************************************************/
	public Boolean Modify(Column clsColumn)
	{
		Column clsFatherColumn;
		clsFatherColumn = this.GetOneByID(clsColumn.FatherID);
		if (clsFatherColumn != null)
		{
			clsColumn.Grade = clsFatherColumn.Grade + 1;
		}
		else
		{
			clsColumn.Grade = clsData.clsConfig.nFirst;
		}

		EntityToDatabase(clsColumn);
		return clsData.Modify();
	}

	/**********************************************************************************************
	 ** 功能描述：	删除
	 ** 输入参数：
	 ** 输出参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-07-22
	 ** 备注：
	 *********************************************************************************************/
	public Boolean Delete(Column clsColumn)
	{
		EntityToDatabase(clsColumn);
		return clsData.Delete();
	}
	#endregion

	#region 查询

	/// <summary>
	/// 查询前台所有一级栏目，没有查到返回null
	/// </summary>
	/**********************************************************************************************
	 ** 功能描述：	查询前台所有一级栏目
	 ** 输入参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-15
	 ** 修改：
	 ** 日期：
	 *********************************************************************************************/
	public List<Column> QueryFirstWebColumns()
	{
		DataTable dt;
		List<Column> listReturn;

		listReturn = new List<Column>();

		dt = clsData.QueryColumn(clsData.clsConfig.nNoFather, clsData.clsConfig.nWebColumn);

		if (dt.Rows.Count > 0)
		{
			foreach (DataRow dr in dt.Rows)
			{
				listReturn.Add(DatabaseToEntity(dr));
			}

			return listReturn;
		}
		else
		{
			return null;
		}
	}

	#endregion
}
